home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d5 / pacman.arc / PACMAN.BAS (.txt) < prev   
Encoding:
GW-BASIC  |  1991-04-28  |  9.8 KB  |  273 lines

  1. 5  DEFINT A-Z
  2. 10  CLS
  3. 15  KEY OFF
  4. 40  GOSUB 4000     'INITIALIZE.
  5. 42  SCREEN 1,0     'SET GRAPHICS MODE.
  6. 44  COLOR 0,1      'BG=BLACK,FG=CYAN,MAGENTA,WHITE
  7. 50  GOSUB 14500    'DRAW PACMAN & GHOST
  8. 60  GOSUB 11250     'DRAW PACMAN BOARD.
  9. 63  GOSUB 8050     'SETUP SCORE BOARD.
  10. 65  GOSUB 10500     'PLACE DOTS.
  11. 70  GOSUB 10000     'PLACE PACMAN & GHOSTS.
  12. 80  GOSUB 7700     'CHECK KEYBOARD.
  13. 100  GOSUB 8900    'MOVE PACMAN.
  14. 110  LOCATE 12,30: PRINT USING "**####"; SCORE  ' PRINT SCORE.
  15. 120  GOSUB 5750    'MOVE GHOSTS.
  16. 150  GOSUB 5000    'IF COLLISION, REDUCE REMAINING LIVES.
  17. 154  IF TOTDOTS = 0  THEN GOSUB 1000: GOTO 70   'REPLACE DOTS AND CONTINUE. **CHK 2000
  18. 155  IF LIVES > 0 THEN GOTO 80
  19. 160  GOSUB 4750                      'ALL LIVES GONE, WIND IT UP.
  20. 170  IF AG=1 THEN GOTO 60            `IF PLAYING AGAIN, START OVER.
  21. 199  END
  22. 1000  REM ROUTINE TO REPLACE DOTS TO CONTINUE PLAY.
  23. 1010  PUT (XPAC,YPAC),PACMAN%,XOR     'REMOVE PACMAN FROM BOARD.
  24. 1020  PUT (XGH1,YGH1),GHOST%,XOR      'REMOVE GHOST.
  25. 1030  GOSUB 10500                      'REPLACE THE DOTS.
  26. 1040  RETURN
  27. 2000  REM REPLACE DOTS TO ALLOW PLAYER TO CONTINUE PLAY.
  28. 2010  PUT (0,0),BOARD%,PSET         'RESTORE BOARD AND DOTS.
  29. 2020  PLAY"O2CFAO3CO2AO3C"
  30. 2030  RETURN
  31. 4000  REM  INITIALIZATION ROUTINE.
  32. 4050  DIM XY(30,33)    'ARRAY TO MARK JUNCTIONS, 1 IF A JUNCTION, 0 IF NOT.
  33. 4100  DIM BOARD%(20)     'ARRAY TO SAVE BOARD AFTER ITS DRAWN. NEEDS 9300 BYTES.
  34. 4150  REM
  35. 4200  SCREEN 0,1: WIDTH 40: COLOR  13,0: LOCATE 2,17: PRINT "PACMAN" : COLOR 14,0
  36. 4250  LOCATE 5,5: PRINT"HIT SPACE BAR FOR DEFAULT CONTROL KEYS   (IE. LEFT:a  RIGHT:l   UP:y   DOWN:b ) "
  37. 4300  LOCATE 9,5: PRINT" OR ANY OTHER KEY TO SELECT YOUR OWN        CONTROLS."
  38. 4350  A$ = INKEY$:  IF LEN(A$) = 0 THEN 4350
  39. 4400  IF A$ = " " THEN LT$="a": RT$="l":UP$="y": DN$="b": GOTO 4700
  40. 4450  PRINT   "Enter character to move pacman - left:"
  41. 4452  LT$=INKEY$: IF LEN(LT$)=0 THEN 4452
  42. 4460  LT$=CHR$(ASC(LT$) OR 32)    'MAKE LOWER CASE.
  43. 4500  PRINT   "Enter character to move pacman - right:"
  44. 4510  RT$=INKEY$:  IF LEN(RT$)=0 THEN 4510
  45. 4520  RT$=CHR$(ASC(RT$) OR 32)    'MAKE LOWER CASE.
  46. 4550  PRINT   "Enter character to move pacman -    up:"
  47. 4560  UP$=INKEY$: IF LEN(UP$)=0 THEN 4560
  48. 4570  UP$=CHR$(ASC(UP$) OR 32)    'MAKE LOWER CASE.
  49. 4600  PRINT   "Enter character to move pacman -  down:"
  50. 4650  DN$=INKEY$: IF LEN(DN$)=0 THEN 4650
  51. 4660  DN$=CHR$(ASC(DN$) OR 32)    'MAKE LOWER CASE.
  52. 4700  RETURN
  53. 4750  REM  ALL PACMAN LIVES ARE USED UP.  WIND UP THE GAME.
  54. 4800  LOCATE 22,25:  PRINT "GAME OVER"
  55. 4850  LOCATE 24,25: INPUT ; "PLAY AGAIN"; ANS$
  56. 4900  IF ANS$ = "Y"  OR ANS$ = "YES" OR ANS$="y" OR ANS$="yes"                         THEN AG=1 ELSE AG=0
  57. 4950  RETURN
  58. 5000  REM      CHECK FOR GHOST COLLISION WITH PACMAN AND HANDLE IT.
  59. 5050  IF (XPAC <> XGH1) OR  (YPAC <> YGH1)  THEN RETURN
  60. 5100  REM A COLLISION HAS OCCURRED.
  61. 5150  PLAY "MFT200O2BGFDD-C"
  62. 5200  PUT (XGH1,YGH1),GHOST%,XOR       'REMOVE GHOST FROM COLLISION SPOT.
  63. 5250  PUT (XPAC,YPAC),PACMAN%,XOR     'REMOVE PACMAN FROM COLLISION SPOT.
  64. 5300  LIVES = LIVES - 1
  65. 5350  XPAC=95: YPAC=143                'START NEW PACMAN IN INIT POSITION.
  66. 5400  PUT (XPAC,YPAC),PACMAN%,XOR
  67. 5450  LINE (200+LIVES*20,70)-(210+LIVES*20,80),0,BF 'REMOVE LIFE ON SCOREBOARD.
  68. 5500  XGH1 = 95:   YGH1 = 71           'RESET GHOST LOCATION.
  69. 5550  PUT (XGH1,YGH1),GHOST%,XOR
  70. 5600  IF LIVES > 0 THEN FOR W = 1 TO 1500: NEXT W   'GIVE PLAYER A LITTLE TIME.
  71. 5650  BEEP
  72. 5700  RETURN
  73. 5750  REM                    MOVE GHOSTS AROUND THE BOARD.
  74. 5800  REM
  75. 5850  REM                    DIRECTIONS:    1 LEFT   2 DOWN  3 RIGHT   4  UP
  76. 5900  PUT (XGH1,YGH1),GHOST%,XOR                  'REMOVE GHOST.
  77. 5950  C = 0   'TEMP FOR TESTING.
  78. 6000  NXGH1 = XGH1:   NYGH1 = YGH1                'SET DEFAULTS.
  79. 6050  ODIR = GH1DIR    'TEMP  SAVE OLD DIR.
  80. 6100  REM SEE IF AT A JUNCTION AND IF SO PICK A NEW DIRECTION.
  81. 6150  XMOD = (NXGH1 + 1) MOD 6 :   YMOD = (NYGH1 + 7) MOD 6  'SEE IF AT A JUNCTN.
  82. 6200  IF (XMOD <> 0) OR (YMOD <> 0) THEN GOTO 6600  'IF NOT, PROCEED IN OLD DIR.
  83. 6250  IF XY((NXGH1+1)/6,(NYGH1+7)/6) <> 1 THEN GOTO 6600  'IF NOT, KEEP MOVING.
  84. 6300  REM GHOST IS AT A JUNCTION SO DECIDE ON DIRECTION.
  85. 6350  IF (ABS(XPAC-NXGH1) > ABS(YPAC-NYGH1)) AND (RND < 0.8)                          THEN IF XPAC>NXGH1 THEN GH1DIR=3 ELSE GH1DIR=1                                  ELSE IF YPAC>NYGH1 THEN GH1DIR=2 ELSE GH1DIR=4    'GO TOWARD PACMAN.
  86. 6400  REM LOCATE 15,25: PRINT "RD" GH1DIR
  87. 6450  REM
  88. 6500  C = C + 1:  IF C > 20 THEN PRINT "C > 20": STOP
  89. 6550  NXGH1 = XGH1:  NYGH1 = YGH1        'RESET DEFAULTS.
  90. 6600  IF GH1DIR = 1 THEN NXGH1 = XGH1-PMINCR:     XA=3: YA=2:  XB=3:  YB=8
  91. 6650  IF GH1DIR = 2 THEN NYGH1 = YGH1+PMINCR:     XA=2: YA=7:  XB=8:  YB=7
  92. 6700  IF GH1DIR = 3 THEN NXGH1 = XGH1+PMINCR:     XA=7: YA=2:  XB=7:  YB=8
  93. 6750  IF GH1DIR = 4 THEN NYGH1 = YGH1-PMINCR:     XA=2: YA=3:  XB=8:  YB=3
  94. 6800  IF NXGH1 < 11 THEN NXGH1 = 173
  95. 6850  IF NXGH1 > 173 THEN NXGH1 = 11
  96. 6900  IF NYGH1 < 11  THEN NYGH1 = 11
  97. 6950  IF NYGH1 > 179 THEN NYGH1 = 179
  98. 7000  REM SEE IF WAY IS CLEAR IN INTENDED DIRECTION.
  99. 7050  IF POINT(NXGH1+XA,NYGH1+YA)  = 2       OR  POINT(NXGH1+XB,NYGH1+YB)  = 2        THEN GH1DIR = INT(RND*4) + 1: GOTO 6500  'IF NOGO THEN CHNG DIR FOR NEXT TIME.
  100. 7100  XGH1 = NXGH1:    YGH1 = NYGH1   'WAY OK, SO SET UP NEW LOCATION.
  101. 7150  GOTO 7550     'SKIP DEBUG CODE.
  102. 7200  NL=25
  103. 7250  LOCATE 16,NL: PRINT "pn " POINT(NXGH1+XA,NYGH1+YA) POINT(NXGH1+XB,NYGH1+YB)
  104. 7300  LOCATE 17,NL: PRINT "NCA"  NXGH1+XA NYGH1+YA
  105. 7350  LOCATE 18,NL: PRINT "ncb"  NXGH1+XB  NYGH1+YB
  106. 7400  LOCATE 19,NL : PRINT "xy " XGH1 YGH1
  107. 7450  LOCATE 20,NL: PRINT "Nxy" NXGH1 NYGH1
  108. 7500  LOCATE 22,NL: PRINT "DIR" ODIR GH1DIR
  109. 7550  PUT (XGH1,YGH1),GHOST%,XOR
  110. 7600  RETURN
  111. 7650  REM
  112. 7700  REM CHECK KEYBRD FOR NEW DIRECTION.
  113. 7750  A$=INKEY$ :  IF LEN(A$) <> 1 THEN RETURN
  114. 7760  A$=CHR$( ASC(A$) OR 32 )
  115. 7800  IF A$ =LT$  THEN PACDIR = 1
  116. 7850  IF A$ =RT$  THEN PACDIR = 3
  117. 7900  IF A$ =UP$  THEN PACDIR = 4
  118. 7950  IF A$ =DN$  THEN PACDIR = 2
  119. 8000  RETURN
  120. 8050  REM SETUP SCORE BOARD.
  121. 8100  SCORE = 0
  122. 8150  LOCATE 2,30: PRINT "PACMAN"
  123. 8200  LOCATE 5,30: PRINT "SCORE"
  124. 8250  LOCATE 7,30:
  125. 8300  PRINT USING "######"; SCORE
  126. 8350  REM
  127. 8400  FOR I = 1 TO 3                     'SHOW 3 LIVES.
  128. 8450  PUT (200+20*I,70),PACMAN%,XOR
  129. 8500  NEXT I
  130. 8550  LIVES = 3                       'INITIALIZE REMAINING LIVES.
  131. 8600  REM
  132. 8650  FOR I = 1 TO 3                   'PUT GHOSTS IN CENTRE BOX.
  133. 8700  PUT (68+12*I,89),GHOST%,XOR
  134. 8750  NEXT I
  135. 8800  RETURN
  136. 8850  REM
  137. 8900  REM MOVE PACMAN  IN DIRECTION HELD IN PACDIR.
  138. 8950  REM  directions: 1. left  2. down
  139. 9000  REM              3. right 4. up
  140. 9050  REM   move pacman
  141. 9100  PUT (XPAC,YPAC),PACMAN%,XOR               'REMOVE FROM OLD LOCATION.
  142. 9150  NXPAC=XPAC: NYPAC=YPAC:  PMINCR=6         'SET DEFAULTS & SPEED .
  143. 9200  REM SPEED (PMINCR) MUST BE ONE OF 1,3,6.
  144. 9250  IF PACDIR = 1 THEN NXPAC = XPAC-PMINCR:    XA=3:  YA=2:  XB=3: YB=8
  145. 9300  IF PACDIR = 2 THEN NYPAC = YPAC+PMINCR:    XA=2:  YA=7:  XB=8: YB=7
  146. 9350  IF PACDIR = 3 THEN NXPAC = XPAC+PMINCR:    XA=7:  YA=2:  XB=7: YB=8
  147. 9400  IF PACDIR = 4 THEN NYPAC = YPAC-PMINCR:    XA=2:  YA=3:  XB=8: YB=3
  148. 9450  IF NXPAC < 11 THEN NXPAC = 173
  149. 9500  IF NXPAC > 173 THEN NXPAC =11
  150. 9550  IF NYPAC < 11 THEN NYPAC = 11
  151. 9600  IF NYPAC > 179 THEN NYPAC = 179
  152. 9650  IF  POINT(NXPAC+XA,NYPAC+YA) <> 2       AND POINT(NXPAC+XB,NYPAC+YB) <> 2       THEN XPAC = NXPAC: YPAC = NYPAC
  153. 9700  REM NOW EAT DOT AND INCR SCORE.
  154. 9750  DOT = POINT(XPAC+5,YPAC+5)
  155. 9800  IF DOT=DOTCOLOR    THEN                     PRESET(XPAC+5,YPAC+5):                  SCORE = SCORE + 10 : TOTDOTS = TOTDOTS - 1
  156. 9850  REM COULD INCR SCORE HERE
  157. 9900  PUT (XPAC,YPAC),PACMAN%,XOR
  158. 9950  RETURN
  159. 10000  REM put characters in initial position
  160. 10050  XPAC = 95:  YPAC = 143
  161. 10100  PUT (XPAC,YPAC),PACMAN%,XOR    'PUT FIRST ACTIVE PACMAN ON BOARD.
  162. 10150  IF SCORE=0 THEN PUT (260,70),PACMAN%,XOR     'REMOVE ONE ACTIVE PACMAN FROM SCOREBOARD.
  163. 10200  IF RND > 0.5 THEN GH1DIR = 1 ELSE GH1DIR = 3  'SET GHOST INIT DIRECTION.
  164. 10250  REM
  165. 10300  XGH1 = 95:  YGH1 = 71
  166. 10350  PUT (XGH1,YGH1),GHOST%,XOR    'PUT FIRST ACTIVE GHOST IN PLACE.
  167. 10400  RETURN
  168. 10450  REM
  169. 10500  REM PLACE DOTS AND CREATE ARRAY.
  170. 10530  LOCATE 15,25: PRINT "GETTING READY..."
  171. 10550  DOTCOLOR = 3       'SET DOT COLOR
  172. 10600  TOTDOTS=0
  173. 10650  FOR IY = 4 TO 196 STEP 6
  174. 10700  FOR IX = 16 TO 178 STEP 6
  175. 10750  XDOT=(IX-4)/6: YDOT=(IY+2)/6: IC=POINT(IX,IY) 'IC=SPOT COLOR.
  176. 10800  IF IX>79 AND IX<115 AND IY>85 AND IY<103 THEN GOTO 10950   'skip middle box.
  177. 10850  IF IC=0 THEN PSET(IX,IY),DOTCOLOR : TOTDOTS=TOTDOTS+1
  178. 10900  IF (IC=0) AND (POINT(IX-6,IY)<>2 OR POINT(IX+6,IY)<>2) AND  (POINT(IX,IY-6)<>2 OR POINT(IX,IY+6)<>2)     THEN XY(XDOT,YDOT) = 1  ' MARK JUNCTIONS.
  179. 10950  NEXT IX:   NEXT IY
  180. 11000  PACDIR = 0        'set not moving
  181. 11050  REM NOW GET ENTIRE BOARD AND SAVE IT.
  182. 11100  GET (0,0)-(0,1),BOARD%  'S/B 184,196
  183. 11120  REM
  184. 11130  LOCATE 15,25: PRINT "READY           "
  185. 11135  FOR W = 1 TO 800: NEXT W: LOCATE 15,25: PRINT "       "
  186. 11150  RETURN
  187. 11200  REM
  188. 11250  REM DRAW THE PLAYING BOARD.
  189. 11300  REM NOTE: DO NOT CHANGE COLOR IN   THE LINE COMMANDS USED TO DRAW THE BOARD UNLESS THE BOARD DETECTION STATEMENTS     (IE. POINT STMTS) IN THE MOVE ROUTINE   ARE ALSO ADJUSTED TO THE SAME COLOR.
  190. 11350  CLS
  191. 11400  REM TOP EDGE.
  192. 11450  LINE (10,4)-(184,10),2,BF
  193. 11500  REM RIGHT EDGE.
  194. 11550  LINE (178,10)-(184,52),2,BF
  195. 11600  LINE (166,40)-(184,52),2,BF
  196. 11650  LINE (166,64)-(184,106),2,BF
  197. 11700  LINE (166,118)-(184,142),2,BF
  198. 11750  LINE (178,142)-(184,196),2,BF
  199. 11800  REM BOTTOM EDGE
  200. 11850  LINE (10,190)-(184,196),2,BF
  201. 11900  REM LEFT EDGE.
  202. 11950  LINE (10,4)-(16,40),2,BF
  203. 12000  LINE (10,40)-(28,52),2,BF
  204. 12050  LINE (10,64)-(28,106),2,BF
  205. 12100  LINE (10,118)-(28,142),2,BF
  206. 12150  LINE (10,142)-(16,196),2,BF
  207. 12200  REM
  208. 12250  LINE (28,22)-(46,28),2,BF
  209. 12300  LINE (58,10)-(64,28),2,BF
  210. 12350  LINE (76,22)-(118,28),2,BF
  211. 12400  LINE (130,10)-(136,28),2,BF
  212. 12450  LINE (148,22)-(166,28),2,BF
  213. 12500  REM
  214. 12550  LINE (40,40)-(46,70),2,BF
  215. 12600  LINE (40,64)-(64,70),2,BF
  216. 12650  LINE (40,82)-(64,88),2,BF
  217. 12700  LINE (40,82)-(46,106),2,BF
  218. 12750  LINE (58,100)-(64,118),2,BF
  219. 12800  LINE (40,118)-(82,124),2,BF
  220. 12850  LINE (40,136)-(64,142),2,BF
  221. 12900  LINE (28,154)-(46,178),2,BF
  222. 12950  REM
  223. 13000  LINE (58,40)-(82,52),2,BF
  224. 13050  LINE (94,40)-(100,64),2,BF
  225. 13100  LINE (76,64)-(118,70),2,BF
  226. 13150  LINE (112,40)-(136,52),2,BF
  227. 13200  LINE (148,22)-(166,28),2,BF
  228. 13250  LINE (148,40)-(154,64),2,BF
  229. 13300  LINE (130,64)-(154,70),2,BF
  230. 13350  REM
  231. 13400  LINE (130,82)-(154,88),2,BF
  232. 13450  LINE (148,88)-(154,106),2,BF
  233. 13500  LINE (130,100)-(136,118),2,BF
  234. 13550  LINE (112,118)-(154,124),2,BF
  235. 13600  REM MIDDLE BOX
  236. 13650  LINE (76,82)-(118,85),2,BF
  237. 13700  LINE (76,82)-(79,106),2,BF
  238. 13750  LINE (76,103)-(118,106),2,BF
  239. 13800  LINE (115,82)-(118,106),2,BF
  240. 13850  REM
  241. 13900  LINE (94,118)-(100,136),2,BF
  242. 13950  LINE (76,136)-(118,142),2,BF
  243. 14000  LINE (130,136)-(154,142),2,BF
  244. 14050  LINE (58,154)-(82,160),2,BF
  245. 14100  LINE (58,160)-(64,178),2,BF
  246. 14150  LINE (94,154)-(100,172),2,BF
  247. 14200  LINE (76,172)-(118,178),2,BF
  248. 14250  LINE (112,154)-(136,160),2,BF
  249. 14300  LINE (130,160)-(136,178),2,BF
  250. 14350  LINE (148,154)-(166,178),2,BF
  251. 14400  RETURN
  252. 14450  REM
  253. 14500  REM DRAW THE PACMAN.
  254. 14550  CIRCLE (105,105),5,1,-0.5,-5.5
  255. 14600  PAINT (103,105),3,1
  256. 14650  DIM PACMAN%(100)
  257. 14700  GET (100,100)-(110,110),PACMAN%
  258. 14750  CLS
  259. 14800  REM
  260. 14850  REM   NOW DRAW THE GHOSTS.
  261. 14900  CLS
  262. 14950  CIRCLE (100,100),5,3,,,1
  263. 15000  PAINT (100,100),1,3
  264. 15050  LINE (90,106)-(110,110),0,BF
  265. 15100  CIRCLE (97,98),1,0
  266. 15150  CIRCLE (103,98),1,0
  267. 15200  CIRCLE (97,105),1,0  'TEETH
  268. 15250  CIRCLE (103,105),1,0
  269. 15300  REM
  270. 15350  DIM GHOST%(100)
  271. 15400  GET (95,95)-(105,105),GHOST%
  272. 15450  RETURN
  273.